/*
 * Copyright (C) 2008 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.zz.framework.core.utils

import android.os.Handler
import android.os.Looper
import android.os.Message

abstract class ZInterval(private val interval: Long) {

    @Volatile
    private var cancelled = false

    private val handler:Handler = Handler(Looper.getMainLooper()) { msg ->
        if (msg.what == MSG) {
            synchronized(this) {
                if (cancelled) return@synchronized true
                onInterval()
                handler.sendEmptyMessageDelayed(MSG, interval)
            }
        }
        true
    }

    @Synchronized
    fun start(): ZInterval {
        cancelled = false
        handler.sendEmptyMessage(MSG)
        return this
    }

    @Synchronized
    fun restart(): ZInterval {
        cancel()
        return start()
    }

    @Synchronized
    fun cancel() {
        cancelled = true
        handler.removeMessages(MSG)
    }

    abstract fun onInterval()

    private companion object {
        private const val MSG = 1111
    }
}
